
#include "STC32G_Timer.h"
#include "STC32G_GPIO.h"
#include "STC32G_NVIC.h"
#include "STC32G_Exti.h"
#include "STC32G_Delay.h"

#include "app_config.h"
#include "drv_encoder.h"
#include "debug.h"

#if TCFG_DRV_ENCODER_SUPPORT

#define D_ENCIO_A   P33     // 编码器A相
#define D_ENCIO_B   P34     // 编码器B相
static uint8_t encoder_value = E_ENCODER_N;

void drv_encoder_init(void)
{
    EXTI_InitTypeDef	Exti_InitStructure;

    P3_SPEED_LOW(GPIO_Pin_3|GPIO_Pin_4);
    // P3_SPEED_HIGH(GPIO_Pin_3|GPIO_Pin_4);
    P3_DRIVE_MEDIUM(GPIO_Pin_3|GPIO_Pin_4);
    // P3_DRIVE_HIGH(GPIO_Pin_3|GPIO_Pin_4);
    // P3_PULL_UP_ENABLE(GPIO_Pin_3|GPIO_Pin_4);
    P3_PULL_UP_DISABLE(GPIO_Pin_3|GPIO_Pin_4);
    // P3_MODE_IO_PU(GPIO_Pin_3|GPIO_Pin_4);
    P3_MODE_IN_HIZ(GPIO_Pin_3|GPIO_Pin_4);
    P3_DIGIT_IN_ENABLE(GPIO_Pin_3|GPIO_Pin_4);


    Exti_InitStructure.EXTI_Mode      = EXT_MODE_Fall;//中断模式,   EXT_MODE_RiseFall,EXT_MODE_Fall
    Ext_Inilize(EXT_INT1, &Exti_InitStructure);				//初始化
    NVIC_INT1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

}

/**
 * @brief   旋转编码器 通知
 * @param   无
 * @note    
 * @return  无
*/
void drv_encoder_notify(void)
{
    encoder_value = E_ENCODER_N;
}

/**
 * @brief   获取旋转编码器值
 * @param   无
 * @note    同时设置编码器值为none
 * @return  0：无操作，1：左旋转(逆时针)，2：右旋转(顺时针)
*/
uint8_t drv_encoder_value(void)
{
    uint8_t enc_value = encoder_value;    
    drv_encoder_notify();
    return enc_value;
}

/**
 * @brief   编码器A相中断处理函数
 * @note    下降沿触发
 * @return  无
*/
void INT1_ISR_Handler (void) interrupt INT1_VECTOR		//进中断时已经清除标志
{
	// TODO: 旋转编码器去抖，A相中断下降沿触发，延时50us判断A相是否为低电平，为低延时100us判断B相电平 0=右旋转(顺时针)，1=左旋转(逆时针)
    D_ENCIO_A = 1;
    delay_us(50);
    if (0 == D_ENCIO_A) {
        D_ENCIO_B = 1;
        delay_us(100);
        if (D_ENCIO_B == 0) {
            encoder_value = E_ENCODER_R;
        } else {
            encoder_value = E_ENCODER_L;
        }
    }    
}

#endif //TCFG_DRV_ENCODER_SUPPORT
